package cn.iocoder.mall.order.api;

import cn.iocoder.common.framework.vo.CommonResult;
import cn.iocoder.mall.order.api.bo.*;
import cn.iocoder.mall.order.api.dto.*;
import cn.iocoder.mall.order.api.vo.OrdersVO;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;

import java.text.ParseException;
import java.util.List;
import java.util.Map;

/**
 * 订单 service
 *
 * @author Sin
 * @time 2019-03-16 13:15
 */
public interface OrderService {

    /**
     * 订单 page
     *
     * @param orderQueryDTO
     * @return
     */
    CommonResult<OrderPageBO> getOrderPage(OrderQueryDTO orderQueryDTO);

    /**
     * 获取订单items
     *
     * @param orderId
     * @return
     */
    CommonResult<List<OrderItemBO>> getOrderItems(Long orderId);

    /**
     * 订单收件人信息
     *
     * @param orderId
     * @return
     */
    CommonResult<OrderRecipientBO> getOrderRecipientBO(Long orderId);

    /**
     * 订单info
     *
     * @param userId
     * @param orderId
     * @return
     */
    CommonResult<OrderInfoBO> info(String userId, Long orderId);

    /**
     * 订单 - 创建
     *
     * @param orderCreateDTO
     * @return
     */
    CommonResult<OrderCreateBO> createOrder(OrderCreateDTO orderCreateDTO);

    /**
     * 订单item - 更新
     *
     * @param orderItemUpdateDTO
     *
     */
    CommonResult updateOrderItem(OrderItemUpdateDTO orderItemUpdateDTO);

    /**
     * 更新订单item - payAmount(实付金额)
     *
     * @param orderId
     * @param orderItemId
     * @param payAmount
     * @return
     */
    CommonResult updateOrderItemPayAmount(Long orderId, Integer orderItemId, Integer payAmount);

    /**
     * 订单 - 取消订单
     *
     * @param orderId
     * @return
     */
    CommonResult cancelOrder(Long orderId, Integer reasons, String otherReasons);

    /**
     * 订单发货
     *
     * @param orderDelivery
     * @return
     */
    CommonResult<OrderRecipientBO> orderDelivery(OrderDeliveryDTO orderDelivery);

    /**
     * 更新订单 - 备注
     *
     * @param orderId
     * @param remake
     * @return
     */
    CommonResult updateOrderRemake(Long orderId, String remake);

    /**
     * 删除订单item
     *
     * @param orderItemDeletedDTO
     * @return
     */
    CommonResult deleteOrderItem(OrderItemDeletedDTO orderItemDeletedDTO);

    CommonResult closeExpireOrder(Long orderId);

    /**
     * 用户确认订单
     *
     * @param userId
     * @param orderId
     * @return
     */
    CommonResult confirmReceiving(String userId, Long orderId);

    /**
     * 更新订单 - 收件这信息
     *
     * 包含：
     * - 详细地址
     * - 区域编号
     * - 联系人电话
     * - 联系人姓名
     */
    CommonResult updateLogistics(OrderLogisticsUpdateDTO orderLogisticsDTO);

    /**
     * 删除订单 // TODO FROM 芋艿 to 小范。删除订单，不要使用 deleted 字段，对于用户是删除，实际是隐藏。
     *
     * @param id
     */
    CommonResult deleteOrder(Long id);

    /**
     * 更新订单支付成功
     *
     * 如果成功，则返回 success
     * 如果失败，则返回具体原因
     *
     * @param orderId 订单编号
     * @param payAmount 支付的订单金额
     * @return 支付结果
     */
    String updatePaySuccess(Long orderId, Integer payAmount);

    /**
     * 监听确认收货
     *
     * mq 更新 status
     */
    CommonResult listenerConfirmGoods();

    /**
     * 监听换货
     *
     * mq 更新 status
     */
    CommonResult listenerExchangeGoods();

    CommonResult generatorOrderCredential(OrderCredentialDTO orderCredentialDTO);


    CommonResult writeOffOrderCredential(WriteOffOrderCredentialDTO dto);

    CommonResult<OrderCredentialBO> getPersonalOrderCredential(CredentialVerifyDTO dto);


    String testDubbo(String s);

    /**
     * 根据ID查询订单详情
     * @param orderQueryDTO
     * @return
     */
    CommonResult<OrderPageBO> getOrders(OrderQueryDTO orderQueryDTO);

    OrderBO getOrderById(Long orderId);

    CommonResult<OrderPageBO> getOrderPageByClerkId(String userIdByToken, Integer pageNo, Integer pageSize);

    /**
     * 通过商铺id获取相应时间段的销售金额
     * @param ordersVO
     */
    CommonResult<List<OrderPayAllChartBO>> getpayAllChart(OrdersVO ordersVO);
    /**
     * 通过商铺id获取一个月的销售金额
     * @param ordersVO
     */
    CommonResult<List<OrderPayAllChartBO>> getpayMonth(OrdersVO ordersVO);
    /**
     * 获取商铺 一月（天） 一年 （月）的销售金额
     * @param ordersVO
     * @return
     */
    Map<String, Integer> getpayMonthofYear(OrdersVO ordersVO);

    /**
     * 查询订单（图表用）
     * @param shopIds
     * @param startTime
     * @param endTime
     * @return
     */
    CommonResult<List<OrderBO>> getOrdersForChart(List<String> shopIds, String startTime, String endTime);

    CommonResult<OrderPageBO> getOrderPageByShopIds(OrderQueryDTO orderQueryDTO);

    /**
     * 获取当前日期上个周的订单总数以及转化率
     * @param shopIds
     * @param ordersVO
     * @return
     */
    CommonResult<Map<Object,Object>> getOrderConversionRate(List<String> shopIds, OrdersVO ordersVO);

    OrdersPageBO getSellerPage(OrdersPageDTO setShopIds);



    /**
     * 根据店员ID获取核销笔数
     * @param clerkIds
     * @param startTime
     * @param endTime
     * @return
     */
    CommonResult<Integer> getOrderCancellationData(List<String> clerkIds, String startTime, String endTime);

    CommonResult<List<OrderBO>> getOrderListByShopIds(List<String> shopIds);

    CommonResult<List<OrderBO>> getOrderBOListByWhereCondition(OrderQueryDTO queryDTO);


    /**
     * 获取商户 各个店铺一个月的销售额
     * @param ordersVO
     * @return
     */
    CommonResult<List<OrderBO>> getpayMonthForSalesVolume(OrdersVO ordersVO);
}
